package hust.rpc.utils;

import java.lang.reflect.Method;

public class SignatureUtils {

    /**
     * 获取方法签名: 全类名.方法名(参数类型...)
     * 其中参数类型不需要确定到范型,因为范型会被擦除
     * List<String>和List<Map<String, Host>>在方法表内均会被记录为List
     * Java保证方法test(List<String>)和test(List<Map<String, Host>>)不会同时存在
     *
     * @param method 方法
     * @return String 方法签名
     */
    public static String getSignature(Method method) {
        StringBuilder sb = new StringBuilder();
        sb.append(method.getDeclaringClass().getTypeName())
                .append('.')
                .append(method.getName())
                .append('(');
        Class<?>[] parameterTypes = method.getParameterTypes();
        for (int i = 0; i < parameterTypes.length; i++) {
            sb.append(parameterTypes[i].getTypeName());
            if (i < (parameterTypes.length - 1)) {
                sb.append(',');
            }
        }
        sb.append(')');
        return sb.toString();
    }

    /**
     * 将方法签名转为服务接口名
     *
     * @param signature 方法签名
     * @return String
     */
    public static String signatureToService(String signature) {
        int size = signature.length();
        boolean meetLeft = false;
        for (int i = size - 1; i >= 0; i--) {
            if (meetLeft && signature.charAt(i) == '.') {
                return signature.substring(0, i);
            } else if (signature.charAt(i) == '(') {
                meetLeft = true;
            }
        }
        return null;
    }
}
